Artikel onlineArtikel online

Einführung in REBOL

von Robbie Schäfer

Anlagen:
Sie können das in diesem Artikel verwendete Beispiel-Skript Geburtstage.r downloaden (3K) oder online anzeigen. Sollten Sie Fragen haben, können Sie mich unter robbie@egge.net anschreiben.


REBOL ist eine neue Programmiersprache, die zeitgleich auf verschiedenen Platformen entwickelt wird. Und die gute Nachricht: Diesmal spielt auch der Amiga wieder bei einer Neuentwicklung in der ersten Liga mit. Grund genug, sich REBOL einmal genauer anzuschauen.

REBOL steht für Relative Expression Based Object Language und wurde von Carl Sassenrath entwickelt, der auch als Vater des AmigaOS gilt. Maßgebend für die Entwicklung von REBOL war der Gedanke, daß der Computer eigentlich dafür entwickelt wurde, den Menschen bei seinen täglichen Aufgaben zu unterstützen. Aber bis heute muß der Mensch sich dem Computer anpassen. Die Devise für REBOL lautet also: einfache Dinge sollen einfach zu realisieren sein. Das führt dazu, daß man für REBOL sehr wenig Syntax zu lernen hat, so daß diese Sprache auch für Computereinsteiger geeignet ist.

REBOL ist darüber hinaus hervorragend als Internetsprache geeignet. So sind zum Beispiel Datentypen für E-Mail, FTP und HTTP eingebaut. An späterer Stelle werde ich Ihnen zeigen, wie einfach diese Internetfunktionalität zu nutzen ist. Dabei wurde auch nicht vergessen, wie wichtig es ist, so eine Sprache auf möglichst vielen Plattformen zu haben. Dadurch können die Systeme, welche REBOL unterstützen direkt über REBOL miteinander kommunizieren. Außer der Amiga Version gibt es bereits Implementierungen für BeOS, BSD, Linux, MacOS, Solaris, Unix und Windows.

Sollte Ihre Neugier nun geweckt sein, können wir ja sofort die ersten Schritte in REBOL machen, denn (noch eine gute Nachricht) REBOL gibt es umsonst! Unter der Adresse www.rebol.com können Sie sich REBOL für Ihre Lieblingsplattform besorgen. Übrigens brauchen Sie sich keine Sorgen um lange Downloadzeiten zu machen, denn das Archiv der aktuellen Version (rebol-1.0.3.1.lzh) benötigt noch nicht einmal 200kb. Das Archiv mit den Dokumentationen im HTML-Format benötigt nochmal etwa 100kb. Anschließend kopieren Sie das Archiv in ein Verzeichnis (z.B.: work:Rebol) und entpacken es. Danach sollten Sie ein Verzeichnis namens rebol-1.0.3 vorfinden, wo sich die Dateien rebol, rebol.r und user.r befinden. rebol ist der REBOL-Interpreter, rebol.r und user.r sind REBOL-Scripte, in denen die wichtigsten Systemeinstellungen gemacht werden. Dabei sollten Sie tunlichst nicht die Datei rebol.r verändern, sonst werden Sie wohl um eine Neuinstallation nicht herumkommen. Die Einstellungen, die für Sie von Bedeutung sind können Sie in user.r verändern. Die Parameter sind nötig, um mit REBOL E-Mail lesen und schreiben zu können, aber REBOL funktioniert auch ohne. Unter host tragen Sie die Adresse des Mailservers ein, also sowas wie "mail.provider.de", unter user ihren Loginnamen und unter pass das Passwort, unter REBOL/Email-head/from noch ihre E-Mail-Adresse. Speichern Sie die Datei ab, und schon können wir mit REBOL loslegen.

Da REBOL eine Interpreter-Sprache ist, haben Sie die Wahl, ob Sie ein REBOL-Script starten, oder ob Sie REBOL-Befehle in einer REBOL-Shell eingeben. Beginnen Sie erstmal mit der zweiten Möglichkeit. Geben Sie in Ihrer Shell rebol ein. Als erstes wird dann die Datei user.r ausgeführt. Sobald das geschehen ist, können Sie dann Ihre Eingaben tätigen. Also geben Sie mal print "Hello World" ein. Und siehe da, REBOL gibt Ihnen Hello World aus. Aber REBOL kann noch mehr:

Lassen Sie uns einmal wirklich die Welt begrüßen. Geben Sie send friend@provider.de "Hello World" ein (Sie sollten natürlich eine existierende Adresse verwenden). Wenn die Eintragungen in user.r korrekt waren und Sie online sind, bekommt Ihr Freund nun eine E-Mail mit dem Text "Hello World" zugeschickt. Beeindruckend, nicht wahr?

Nun aber zu den Fakten. In REBOL werden Daten als Werte (Values) bezeichnet. Davon gibt es eine Reihe unterschiedlicher Typen, von denen ich hier nur einige aufliste (eine vollständige Beschreibung in englischer Sprache findet sich in den Dokumentationen quick.html, users.html, experts.html):

Zahlen (Numbers): 1223 -23 3.1415
Daten (Dates): 12.10.1988 20-Apr-1998 13/6/1970
Strings: "Hello World"
Dateien (Files): %user.r %pie.jpg
Email: info@rebol.com
URLs: http://www.rebol.com

Diese Beispiele sollten erstmal ausreichen. REBOL-Scripte bestehen aus Wörtern, die zu einem gewissen Zeitpunkt ausgewertet werden. Wörter entsprechen Variablen in anderen Programmiersprachen, aber sind nicht auf die Verwendung als solche beschränkt. Dabei ist es egal, ob die Wörter groß oder klein geschrieben werden, also TEST, test und Test sind in REBOL ein und dasselbe Wort. Diesen Wörtern können nun auch Werte zugewiesen werden:
test: "Hallo Welt"
Das Wort test enthält nun den String "Hallo Welt". Geben Sie nun print test ein, wird der Inhalt von test ausgewertet, also statt test wird der String ausgegeben. Versuchen Sie das gleiche nochmal mit

test: [1 + 1]
print test

Wie Sie sehen, wird "2" ausgegeben, was daran liegt, daß der Ausdruck in test erst ausgewertet wird, also die Addition durchgeführt wird. In diesem Beispiel haben Sie nun auch schon Blöcke kennengelernt, mit denen Sie Werte gruppieren können. Blöcke werden durch eckige Klammern gekennzeichnet und können alle möglichen Werte enthalten, auch REBOL-Anweisungen und andere Blöcke.

Definieren Sie nun den folgenden Block:
Daten: ["12.10.1960" "1.1.1943" "4.6.1970" "8.10.1989"] und geben Sie dann print make date! first Daten ein. Nun, was ist passiert? REBOL fasst Daten als Liste von Werten auf. Um nun auf ein Element in der Liste zugreifen zu können, bietet REBOL für die ersten fünf Elemente vereinfachte Zugriffsfunktionen an (first, second, third, fourth, fifth). Für den Englischsprachigen mit Sicherheit sehr praktisch. Falls Sie auf ein weiter entferntes Listenelement zugreifen wollen, dann geht das mit der pick Anweisung. Beispiel:

Buchstaben: [a b c d e f g h i j k]
pick Buchstaben 7

liefert ein "g". Zurück zum Daten-Beispiel. Die Auswertung von first Daten liefert also den String 12.10.1960. Sie können das auch nochmal mit print first Daten ausprobieren. make date! wiederum wandelt den ausgewerteten Ausdruck first Daten in das REBOL-interne Datumsformat um, welches dann anschließend mit print ausgegeben wird. Dabei ist es fast egal, wie Sie das Datum definiert haben. Die REBOL Datentypen sind intelligent genug, um zu erkennen, daß 12.10.1960, 12-10-1960 , 1960/10/12 alles Datumsangaben sind. Falls ein Wert nicht umgewandelt werden kann, z.B. 12.100.1990, so wird ein none zugewiesen.

Natürlich bietet REBOL auch Kontrollstrukturen, doch dafür sollten Sie jetzt mal die REBOL-Shell verlassen, und Sich den REBOL-Scripten zuwenden. Geben Sie also quit ein, um REBOL zu verlassen.

REBOL-Scripte sind einfache Textdateien, in denen Wörter und REBOL-Anweisungen stehen. In der Regel haben die Dateinamen der REBOL-Scripte die Endung ".r", was aber nicht zwingend notwendig ist. Schreiben Sie nun mit einem Texteditor folgende Zeilen ab, und speichern Sie das Script unter den Namen test.r:

REBOL []
loop 10
[
  print "REBOL ist toll!"
]

Ein REBOL-Script beginnt immer mit REBOL gefolgt von einem Block, der in unserem Beispiel leer ist. Normalerweise sollten in dem Block aber Daten wie Titel, Autor, Version usw. verzeichnet sein. Durch einen Fehler in REBOL ist es zur Zeit leider noch nicht möglich, die REBOL-Scripte aus anderen Verzeichnissen zu starten. Achten sie also vorerst darauf, daß sich Ihre REBOL-Scripte im gleichen Verzeichnis wie rebol befinden. Der Fehler ist den Entwicklern aber bekannt und sollte in den nächsten Versionen nicht mehr auftauchen. Gestartet werden kann das Script nun auf zwei verschiedene Arten. Die erste Möglichkeit besteht darin, REBOL mit dem Script aufzurufen, also rebol test.r. Der andere Weg ist, das Script aus REBOL selbst zu starten. Dazu starten sie also erstmal REBOL mit dem Befehl rebol und geben danach do %test.r ein. Wie vorhin angedeutet, werden Dateien in REBOL mit einem %-Zeichen kenntlich gemacht. In beiden Fällen befinden Sie sich nach Ablauf des Scriptes in der REBOL-Shell. Um REBOL nach Beendigung des Scriptes automatisch zu verlassen, fügen Sie dem Script als letzten Befehl noch ein quit hinzu.

Nun haben Sie mit loop bereits den ersten Schleifentyp in REBOL kennengelernt. Die Anweisungen in dem folgenden Block werden so oft ausgeführt, wie durch die Zahl hinter loop angegeben ist. Will man nun auch auf den Zähler selbst zugreifen, so geht das mit repeat wie im folgenden Beispiel:

repeat i 9
[
  if even? i
  [
    print [i "ist gerade"]
  ]
  else
  [
    print [i "ist ungerade"]
  ]
]

Verzweigungen kann man wie in anderen Programmiersprachen mit if realisieren. Mit even? i wird überpüft, ob i eine gerade Zahl ist, und diese Überprüfung liefert dementsprechend true oder false zurück. Der Block nach \if\ wird nur bei dem Ergebnis true ausgeführt. Ansonsten wird der Block nach else ausgeführt.

Nachdem ich Ihnen noch zeige, wie man in REBOL Funktionen definiert, haben Sie das Rüstzeug für ein größeres Beispiel mit praktischem Nutzen. Funktionen werden ganz einfach erstellt. Nach dem Schlüsselwort func kommt ein Block mit den Funktionsparametern, und der darauffolgende Block ist der Funktionsrumpf, in dem die Anweisungen stehen. Beispiel:

mw: func [a b c] [(a + b + c) / 3]
print mw 3 4 5

Nun aber zu dem wirklich "nützlichen" Beispiel:
Vergessen Sie auch so oft die Geburtstage Ihrer Freunde und Verwandten? Und schimpfen diese Sie regelmäßig deswegen aus? Dann ist geburtstage.r genau das richtige REBOL-Script für Sie. Damit können Sie eine Datei von Ihren Freunden anlegen, die jeweils Name, Vorname, E-Mail und den Geburtstag enthält. Auf Wunsch vergleicht dann das REBOL-Script das Geburtsdatum mit dem heutigen Datum, und schickt an alle, die Geburtstag haben, eine E-mail mit dem Betreff "Happy Birthday".

Das Listing können Sie hier online anzeigen lassen. Wenn Sie es benutzen wollen, dann können Sie die Version ohne Zeilennummern downloaden, da ich sie nur eingefügt habe, um Ihnen einige Dinge zum Listing erklären zu können. REBOL kann mit den Zeilennummern nichts anfangen. Die ersten 7 Zeilen sind der obligatorische REBOL-Header. Danach geht es dann mit dem eigentlichen Script los. Zuerst wird das Wort choice definiert, mit dem später im Listing die Menuauswahl realisiert wird. Dann wird versucht, die Datei friends.dat zu öffnen. Beim ersten Programmstart existiert diese natürlich noch nicht. Deshalb wird friends im else-Zweig ein leerer Block zugewiesen. Die Funktion displayMenu ist eigentlich ziemlich selbsterklärend. Nur sollte erwähnt werden, daß die Zeichenfolge ^/ für ein Zeilenumbruch steht und daß prin kein Druckfehler ist, sondern das gleiche bewirkt wie print, allerdings ohne einen Zeilenumbruch am Ende. Schauen Sie sich nun die Zeile 73 an. Dort beginnt unsere Hauptschleife, die solange durchlaufen wird, bis choice den Wert "0" hat. Je nach Wert von choice wird eine der vier Funktionen aufgerufen, die alle mit der Liste friends arbeiten. In addFriend (Zeile 24) werden die Variablen name, vorname, email, geburtstag mit input eingelesen, und mit der make! Funktion sofort in den richtigen Datentyp umgewandelt. In Zeile 37 werden die vier Variablen dann zu einem Block zusammengefasst, und mit insert tail an das Ende der Liste friends gehängt. Um später mit deleteFriend einen ganzen Datensatz zu löschen, ist es wichtig zu wissen, in welcher Reihenfolge die Parameter eingefügt wurden. Nämlich [name vorname email geburtstag]. In deleteFriend wird nun nach einer E-Mail-Adresse gesucht, da die im Gegensatz zu den anderen Parametern nicht doppelt vorkommen darf. Daher muß man, wenn die E-Mail-Adresse gefunden wurde in der Liste zwei Schritte zurückgehen, um auf den ersten Parameter name zu kommen, was mit skip ... -2 geschieht. Mit remove/part ... 4 werden von dort aus dann vier Elemente aus der Liste entfernt. In showFriends durchläuft die forskip Anweisung (Zeile 51) die Liste indem sie jeweils vier Elemente überspringt. Die Zeile 60 in checkDates verdient noch einmal eine genauere Betrachtung. Das Wort now enthält die Systemzeit, und zwar im Format Tag/Monat/Jahr/Stunde:Minute:Sekunde. Da wir für die Geburtstage ja nur das Datum benötigen, holen wir uns die Werte mit first,second,third heraus, fassen die Einzelwerte mit reduce zu einem Wert zusammen und machen daraus wiederum ein Datum. Anschließend wird das heutige Datum mit jedem Geburtstag verglichen, und falls die Daten (bis auf das Jahr) gleich sind, so wird eine E-Mail an das Geburtstagskind geschickt. Sobald Sie im Hauptmenu eine "0" eingeben, wird die friends-Liste abgespeichert, und das Programm verlassen. (Falls die E-Mail Einstellungen in der user.r nicht korrekt sind, wird das Script beim Versuch die E-Mail zu verschicken mit einer Fehlermeldung abbrechen.

Ich vermute mal, daß Ihnen mittlerweile der Kopf rauchen wird, denn für einen einführenden Bericht haben Sie bereits viel über REBOL erfahren können. Aber Rebol hat ja auch sehr viel zu bieten. So bin ich zum Beispiel noch nicht auf REBOL-Objekte eingegangen, kann Ihnen aber schonmal verraten, daß sie mit remove/part schon eine Objekt-Methode benutzt haben. Auch konnte ich nur auf einen kleinen Teil der über 200 Vordefinierten Wörter eingehen.

REBOL ist jetzt schon sehr mächtig, und für die nächsten Versionen sind unter anderem noch folgende Dinge geplant:
- GUI
- Grafik
- Sound
- Unicode
- Parser.

Wer also jetzt Lust auf mehr bekommen hat, der kann sich ja noch ein bißchen auf den REBOL-Webseiten umschauen. Neben den REBOL-Programmen und Dokumentationen finden sich dort auch viele REBOL-Scripte, unter anderem eines, mit denen die REBOLer ihre Webseiten warten. Und man kann sich dort auch in die REBOL-Mailingliste eintragen, wo recht reger Betrieb herrscht, und sich auch immer mal wieder die REBOL-Entwickler zu Wort melden.

© 1998-2000 thomas raukamp communications.
All rights reserved. Webmaster: Nico Barbat.